Содержание#
- Введение
- Предисловие
- Обзор
- Начало работы с фреймворком
- Языки разработки
- Сессия приложения
- Взаимодействие с базой данных
- Кэширование данных
- Объектные запросы и ORM-операции
- Реляционные запросы
- Сравнение методов и работа с большими данными
- Sql-функции для работы с объектами
- Классы
- Устройство класса
- Работа с объектами и коллекциями
- Миксины и трейты
- Сервисные возможности для классов
- Служебные атрибуты и основные сервисы
- Автонумерация и генерация значений
- Принцип работы автонумерации
- Управление данными объекта
- Клонирование операций
- Работа с файлами в системе
- Файловая корзина
- Сервис сканирования файлов
- Безопасность и системное управление
- Объектные характеристики
- Правила валидации атрибутов
- Типы объектов
- Тип объекта
- Настройки типа объекта
- Закладки типа объекта
- Свойства типа объекта
- Печатные формы
- Управление атрибутами
- Переходы состояний
- Типы прикрепленных файлов
- Настройка прикрепленных документов
- Операции отчетной формы
- Объектные характеристики
- Период расчета
- ИФНС для вывода 4 раздела налоговой декларации по имуществу
- Автовычисляемые колонки
- Лист рассылки системных уведомлений
- Настройка связей между типами документов при создании
- Функциональные настройки
- Документооборот
- Отражение в учете
- Замещения прав
- Выгрузка в файл
- Пообъектные права по умолчанию
- Типы текстовых примечаний
- Настройка сторон документа
- Регистрация настроек из кода
- Выборки
- Работа с выборками
- Настройки отображения выборки
- Разметка и оформление выборки
- Операции выборки
- Частично загружаемые деревья
- Диалоги
- Сервис группового редактирования
- Мастер пользовательского ввода
- Универсальный фильтр
- Общее описание универсального фильтра
- Логика работы универсального фильтра
- Общая схема работы
- Связь выборки и класса
- Связь атрибута выборки и атрибута класса
- Доступные элементы фильтра
- Инициализация атрибутов фильтра
- Особенности атрибутов
- Формирование условий фильтрации
- Объектные и реляционные запросы
- Преобразование условий в SQL
- Примеры формируемых SQL-макросов
- Строковый атрибут
- Числовой атрибут
- Булевый атрибут
- Дата
- JSON-атрибут
- BLOB-атрибут
- CLOB-атрибут
- Ссылочный атрибут
- Примеры макросов для класса Bs_Goods
- Собственное поле класса
- Ссылочное поле класса через join
- Ссылочное поле класса с множественным выбором
- Фильтрация коллекций
- Коллекция первого уровня вложенности по значимому атрибуту
- Коллекция первого уровня вложенности по ссылочному атрибуту через join
- Коллекция второго уровня вложенности
- Макрос с несколькими условиями
- Практические сценарии настройки универсального фильтра
- Настройка атрибутов класса
- Настройка коллекций фильтрации
- Настройка атрибутов выборки
- Обработка событий фильтра
- Реализация кастомной фильтрации в прикладном коде
- Программное использование универсального фильтра
- Отображение в выборке
- Фреймы и редакторы
- MDA-таблица
- Инструменты
- Обозреватель проекта
- Работа в IntelliJ IDEA
- Отладка приложений
- Тестирование
- Unit-тестирование
- Массовое тестирование модулей
- JEXL-тесты
- Нагрузочное тестирование
- Интеграционное тестирование
- UI-тестирование
- Подготовка тестирования
- Создание и настройка
- Запуск тестов
- Проверка результата
- Особенности UI-тестирования
- Проверка входа в систему
- Проверка навигации
- Проверка выборок
- Проверка фильтрации и поиска
- Проверка карточек объектов
- Проверка создания объекта
- Проверка изменения объекта
- Проверка удаления объекта
- Проверка операций
- Проверка мастер-деталь связей
- Проверка сообщений и ошибок
- Проверка пользовательских настроек интерфейса
- Проверка печатных форм и отчетов
- Проверка файловых операций
- Проверка адаптивности и браузеров
- Проверка прав доступа в интерфейсе
- Изоляция и повторяемость
- Интеграция в массовый запуск или CI/CD
- Типовые проблемы
- Рекомендации
- Ограничения
- Горячие клавиши
- Буфер обмена
- Статический анализ
- Отчеты
- Построение отчета
- Печатная форма
- Типы отчетов
- Интерактивные отчёты
- Основные возможности
- Объявление отчёта интерактивным
- Настройка интерактивного отчёта
- Изменение параметров интерактивного отчёта
- Пользовательские JEXL-операции
- Переопределение выборки интерактивного отчёта
- Параметры для передачи в отображение интерактивного отчёта
- Ошибки отображения интерактивного отчёта
- Перенос печатных форм между ландшафтами
- Jasper Reports
- Дистрибутив
- Jaspersoft Studio
- Обучающее видео
- Документация JasperReports
- Пользовательский интерфейс
- Колонки
- Bands
- Настройка среды Jaspersoft Studio
- Проект отчета
- Создание простой печатной формы
- Двухуровневый отчёт (мастер-деталь)
- Отчет книга (Report Book)
- Параметризация шаблонов
- Экспорт
- Построение отчёта на основе JSON-данных
- Скриптлет (Scriptlet)
- Публикация отчётов в БД
- Отчет с содержанием
- Шаблоны отчетов
- Организация разработки
- Основные понятия
- Проект
- Проектная разработка
- Общие положения
- Выбор способа проектной доработки
- Общая схема выбора
- Когда использовать настройку через интерфейс
- Когда использовать объектные и универсальные характеристики
- Когда использовать код и ODM
- Когда использовать JEXL
- Когда использовать точку расширения
- Когда использовать проектное переопределение
- Когда создавать проектную копию типового объекта
- Краткие примеры выбора способа реализации
- Проектное именование
- Связь с общими правилами именования
- Проектный префикс
- Именование проектных модулей
- Именование проектных классов
- Именование проектных коллекций
- Именование проектных атрибутов
- Именование проектных характеристик
- Именование кодов проектных записей
- Именование проектных выборок и отображений
- Именование Api, Avi, Pkg и Lib
- Именование наследующих файлов и проектных переопределений
- Именование проектных печатных форм
- Именование проектных JEXL-скриптов
- Именование универсальных справочников и интеграционных настроек
- Атрибуты и модель данных
- Расширения и переопределения
- Интерфейс, печатные формы и JEXL
- Поставка, тестирование и сопровождение
- DataInstall и миграции
- Требования к скриптам установки данных
- Миграционные пакеты проектного модуля
- Права доступа
- Аудит
- Система контроля версий
- Ветки и ревью
- Проверка производительности при ревью
- Релиз
- Минимальный набор проверок
- Регрессионное тестирование
- Документирование проектных изменений
- Запрещенные практики
- Чек-лист проектного разработчика
- Релизы
- Подход expand/contract при обновлении системы
- Работа с Git
- Введение
- Основные понятия Git
- Устранение конфликтов слияния
- Ответы на частые вопросы
- Приложение
- Развёртывание рабочего места
- Подготовка и включение кросс-компиляции модуля для Scala 3
- Подключение сторонних библиотек к локальному globalserver
- Переход на пакеты сборки
- Пример содержимого project.yaml
- Оптимизация работы системы
- Введение
- Оптимизация работы с БД
- Целесообразность внешних ключей на регистровых таблицах
- Введение
- Внешние ключи на регистровых таблицах и их реальная цена
- Почему внешний ключ всегда приводит к появлению индекса
- Стоимость индексов при вставке данных
- Анализ использования индексов
- Сброс статистики и интерпретация данных
- Ограничения статистики: bitmap-сканирования
- Пример запроса для поиска кандидатов на удаление индексов
- Генерация/отключение/удаление индексов и внешних ключей
- HOT-обновления в PostgreSQL и управление нагрузкой
- Целесообразность внешних ключей на регистровых таблицах
- Оптимизация и ревью кода Scala
- Ревью Scala-кода
- Производительность и качество кода
- Метаданные и структура классов
- Конфигурация модулей
- Использование стандартных компонентов GSF
- Ошибки, исключения и транзакции
- Структура Scala-кода
- Безопасность и надежность
- Работа с API и ROP
- Работа с БД и SQL
- Архитектура и дизайн
- Работа с атрибутами и полями
- Строки и JSON
- UI, AVI и списочные отображения
- Безопасное получение значений в списках
- Поля с большим объемом данных
- Корректная активация и деактивация операций
- Управление доступностью кнопок в списках
- Структурирование настроек выборки
- Переходы состояний
- Синхронизация данных с интерфейсом
- Кастомные выборки
- Идентификатор в результатах выборки
- Предпочтительные способы получения данных
- Структура данных при переопределении
- Отражение и ввод-вывод
- Модульные и проектные особенности
- Блокирующие замечания
- Оптимизация Scala-кода
- View и withFilter для оптимизации коллекций
- Объединение условий фильтрации
- Отложенные вычисления с lazy val
- Выбор коллекции по сложности поиска
- Защита циклов от зацикливания
- Встроенные методы вместо эмуляции
- ArrayBuffer вместо ListBuffer
- exists вместо filter для проверки
- isEmpty вместо length для пустоты
- getVar вместо запросов к БД в CWA
- Избегание copyAro для экономии памяти
- Разделение логики Avi и Api
- Форматирование длинных выражений
- Общие trait для повторного использования
- Библиотеки общих методов для выборок
- Экстракторы вместо полей Tuple
- Безопасные методы коллекций с Option
- Строковая интерполяция вместо конкатенации
- StringBuilder для сложных строк
- Option для обработки null-значений
- Запросы вне вложенных циклов
- Параллельные вычисления для независимых задач
- Оптимизация работы с данными и кэшем
- Применение refreshByParent и refreshByKey
- Применение Session.commit, Session.commitWork, flush и flush(true)
- Загрузка множества объектов
- Предварительная прогрузку данных в кэш через batchIn и queryKeys
- Массовая обработка объектов через Btk_BulkProcessPkg().chunkedQuery
- При массовой регистрации объектов используйте Btk_BulkProcessPkg().findObjects
- Ревью Scala-кода
- Оптимизация и ревью SQL-запросов
- Ревью SQL-запросов
- Общие моменты и плохие практики
- Указывать только нужные столбцы
- Оптимизация условий фильтрации
- Соответствие типов
- Обработка альтернативных условий
- Безопасность отрицательных условий
- Коррелированные подзапросы
- Эффективная пагинация данных
- Эффективность выборки первых записей
- Контроль дублирования и сортировки
- Баланс сортировки и производительности
- Параметры вместо «врезки» значений в SQL
- Минимизируйте количество полей в GROUP BY
- Фильтруйте по индексируемым «бизнес-полям», а не по служебным/производным
- Корректность соединения по ключам
- Рекурсивные запросы: защита от циклов обязательна
- Запрещено выполнять SQL-запросы в методе checkworkability
- Запрещено выполнять SQL-запросы внутри вложенных циклов.
- Приведение типов в соответствие с типом колонки
- Использование многострочных комментариев
/* … */вместо--
- Индексы
- JOIN-стратегии
- Индексы на ключах JOIN
- Порядок JOIN
- Оптимизация порядка операций
- Работа с большими реестрами
- Коррелированный подзапрос с несколькими полями
- «Последняя запись»
- Массовый «top-1 по ключу»
- Валидация путей доступа (количество чтений)
- Партиционирование/секционирование
- Денормализация
- Фоновые задачи для больших JOIN
- Оптимизация больших запросов
- Анализ плана выполнения
- Тестирование и мониторинг
- Работа с ORM и OQuery
- Особенности selectStatement и @FlushBefore
- Общие моменты и плохие практики
- Оптимизация SQL-запросов
- Пример чтения плана запроса
- Ревью SQL-запросов
- JEXL-скрипты в Global ERP
- Дополнительно
- Локализация приложений
- Пользовательские (динамические) приложения
- Логирование
- ForDisableControls
- Проектные расширения
- Интеграция с сервером
- Параллельные вычисления
- Асинхронное обновление данных в связанных классах
- Средства мониторинга работы системы.
- Сервисы сервера приложений
- Введение
- SSH-консоль сервера
- WebSocket консоль сервера
- Jexl через SOAP и REST
- REST-сервис
- Сервис отчётов
- Аутентификация в REST/SOAP-сервисах
- Работа с HTTP-запросами
- Принципы работы commit и flush
- RabbitMQ
- StyleBuilder
- DynamicEditorBuilder
- SQL-инъекции
- Наборы значений
- Работа механизма DataInstall
- Приложение
- Рекомендации по проектированию интерфейсов
- Практические советы
- Создание выборки без класса
- Создание avm-файла для выборки без класса
- Проектное переопределение
- Наследование базовой логики
- Проектные переопределения
- Работа с данными, хранящимися в jsonb контейнере
- Работа с серализированными данными
- JSON
- XML
- Классы-расширения. Simple Extensions
- Запуск отладки/теста
- Как вносить изменения
- Как обновить внешние зависимости
- Как переопределить методы API
- Как переопределить методы AVI
- Как переопределить сеттеры API
- Как переопределить сеттеры AVI
- Как сбросить кэш
- Как собрать проект
- Как создать класс
- Как создать коллекцию
- Как создать новое отображение
- Как создать точку расширения
- Найти и открыть класс из настройки системы
- Настройка автонумерации
- Настройка группировки класса
- Поиск по коду в Idea
- Создание логического атрибута класса
- Практики разработки
- Практика AVI
- Формирование выборки в AVI
- Работа с нехранимыми полями
- Нехранимые строки в коллекциях
- Динамические столбцы
- Введение
- Когда использовать динамические столбцы
- Подходы к реализации
- Базовое правило именования
DynMetaBuilderиDynRecBuilder- Пример: динамические колонки по датам
- Настройка отображения
- Реализация через SQL
- Реализация через
DynMetaBuilderиDynRecBuilder - Дополнительные данные строки через
extend2(...) - Динамические стили
- Динамические редакторы
- Упрощённая реализация в карточках объектных характеристик
- Как настраивать динамические колонки
- Вывод
- Технические особенности и утилиты Avi
- Динамическое изменение свойств avm через setMetaProp
- Работа с датами в onRefreshExt
- Поиск отображения на выборке
- Пользовательская блокировка
- Объект класса в процессе создания и другие состояния объекта rop
- Определение главной выборки формы
- Фильтрация в деревовидном списке (отображение Tree классов-деревьев)
- Полезные практики от опытных разработчиков
- Практика SQL
- Практика avm, примеры интерфейсов
- Присоединение нескольких отображений
- Отключение сворачивания отображения
- Динамическая смена отображения
- Фиксация ширины столбца или поля
- Сортировка данных в гридах
- Скрытие описания поля
- Стилизация ячейки в списке
- Настройка всплывающих подсказок
- Практика odm
- Защита от HTML-инъекций
- Практика код
- Вычисление суммы без использования буфера
- Группировка объектов с использованием null-типов
- Сравнение диапазона дат
- .distinct или .toSet для scala-коллекций и особенности применения
immutable.Map.builderвместоmutable.Map- Признак наличия модуля на проекте
- Применение ASQL/ ASelect/ OQuery/ TxIndex/ refreshByParent и byParent
- Практики при разработке документов
- Практика AVI